www.gusucode.com > 基于VBLAST-OFDM的MATLAB SIMULATION,图形化界面,并且给出了各仿真图 > 基于VBLAST-OFDM的MATLAB SIMULATION,图形化界面,并且给出了各仿真图/vblast-ofdm simulation/rx_diversity.m

    function [data_syms_out] = rx_diversity(freq_data_syms, ...
   channel_est, SimulationParameters)

% remove extra dimension from matrices, if rx diversity is not used
freq_data_syms = squeeze(freq_data_syms);
% tx diversity
   % Radon-Hurwitz transmit diversity
   if (SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==0) % 2x1
      freq_data_syms = rx_radon_hurwitz(freq_data_syms, channel_est(:,:),SimulationParameters);
  elseif (SimulationParameters.TxDiv==4 & SimulationParameters.RxDiv==0)%4x1
      [freq_data_syms] = txfour(freq_data_syms,channel_est,SimulationParameters,3);    
      data_syms_out=freq_data_syms;
  elseif (SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==2)%2x2
      % Rx R-H performed to both receiver antennas
      freq_data_syms(1,:,:) = rx_radon_hurwitz(squeeze(freq_data_syms(1,:,:)), ...
         channel_est(:,1:2),SimulationParameters);
      freq_data_syms(2,:,:) = rx_radon_hurwitz(squeeze(freq_data_syms(2,:,:)), ...
         channel_est(:,3:4),SimulationParameters);
  elseif (SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==4)%2x4
      freq_data_syms(1,:,:) = rx_radon_hurwitz(squeeze(freq_data_syms(1,:,:)), ...
         channel_est(:,1:2),SimulationParameters);
      freq_data_syms(2,:,:) = rx_radon_hurwitz(squeeze(freq_data_syms(2,:,:)), ...
         channel_est(:,3:4),SimulationParameters);
      freq_data_syms(3,:,:) = rx_radon_hurwitz(squeeze(freq_data_syms(3,:,:)), ...
         channel_est(:,5:6),SimulationParameters);
      freq_data_syms(4,:,:) = rx_radon_hurwitz(squeeze(freq_data_syms(4,:,:)), ...
         channel_est(:,7:8),SimulationParameters);
  elseif (SimulationParameters.TxDiv==4 & SimulationParameters.RxDiv==2) %4x2
      channel_est=channel_est(:,:);
      [freq_data_syms] = txfour(freq_data_syms(1:2,:,:),channel_est,SimulationParameters,1);    
      data_syms_out=freq_data_syms;
  elseif (SimulationParameters.TxDiv==4 & SimulationParameters.RxDiv==4) %4x4
      % Rx R-H performed to 4 receiver antennas
      [freq_data_syms1] = txfour(freq_data_syms(1:2,:,:),channel_est,SimulationParameters,1);    
      [freq_data_syms2] = txfour(freq_data_syms(3:4,:,:),channel_est,SimulationParameters,2);
      data_syms_out=[freq_data_syms1 freq_data_syms2];
  end
% rx diversity
   if (SimulationParameters.TxDiv==0 & SimulationParameters.RxDiv==2)|(SimulationParameters.TxDiv==0 & SimulationParameters.RxDiv==4) %1x2,1x4
      freq_data_syms = rx_mr_combiner(freq_data_syms, channel_est, SimulationParameters);
   elseif SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==2 %2x2
      freq_data_syms = squeeze(freq_data_syms(1,:,:) + freq_data_syms(2,:,:));
   elseif SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==4  %2x4
      freq_data_syms = squeeze(freq_data_syms(1,:,:) + freq_data_syms(2,:,:)+freq_data_syms(3,:,:) + freq_data_syms(4,:,:));
   end

% no diversity
if (SimulationParameters.TxDiv==0 & SimulationParameters.RxDiv==0) %1x1
   % Data symbols channel correction
   chan_corr_mat = repmat(channel_est,1, size(freq_data_syms,2));
   freq_data_syms = freq_data_syms.*conj(chan_corr_mat);
end

if (SimulationParameters.TxDiv==0 & SimulationParameters.RxDiv==0)|(SimulationParameters.TxDiv==0 & SimulationParameters.RxDiv==2)| ...
        (SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==0)|(SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==2)| ...
        (SimulationParameters.TxDiv==0 & SimulationParameters.RxDiv==4)|(SimulationParameters.TxDiv==2 & SimulationParameters.RxDiv==4) 
                                                                                            %1x1,1x2,2x1,2x2,1x4,2x4
% Amplitude normalization
chan_sq_amplitude = sum(abs(channel_est(:,:)).^2, 2);
chan_sq_amplitude_mtx = repmat(chan_sq_amplitude,1, size(freq_data_syms,2));
data_syms_out = freq_data_syms./chan_sq_amplitude_mtx;
end